package com.greydawn.DecoratorPattern;

/**
 * @author zhongwr
 * @date 2021-12-09 09:49:50
 * @description 装饰者模式测试
 * 装饰者模式的精髓在于对象行为的拓展，不对原对象产生任何影响的前提下进行行为拓展，具体怎么引用原对象，下面提供了构造方法和参数传递两种方式。
 *
 * 关键代码： 1、Component（Order） 类充当抽象角色，不应该具体实现。 2、修饰类引用和继承 Component 类，具体扩展类重写父类方法。
 * 优点：装饰类和被装饰类可以独立发展，不会相互耦合，装饰模式是继承的一个替代模式，装饰模式可以动态扩展一个实现类的功能。
 * 缺点：多层装饰比较复杂。
 * 使用场景： 1、扩展一个类的功能。 2、动态增加功能，动态撤销。
 * 注意事项：可代替继承。
 */
public class DecoratorTest {

    public static void main(String[] args) {

//        HotPotOrder hotPotOrder = new HotPotOrder();
//        DishesBeef dishesBeef = new DishesBeef(hotPotOrder);
//        DishesFish dishesFish = new DishesFish(dishesBeef);
//
//        dishesBeef.addFood();
//        dishesFish.addFood();
//        System.out.println("=========");


        HotPotOrder hotPotOrder = new HotPotOrder();
        DishesBeef dishesBeef = new DishesBeef();
        DishesFish dishesFish = new DishesFish();

        dishesBeef.addFood(hotPotOrder);
        dishesFish.addFood(dishesBeef);
        dishesFish.show();
        System.out.println("总价：" + dishesFish.countPrice());

    }
}
